/* Nokia 3310 LCD Library
 * for STM32
 * 
 * (c) Maciej Suminski 2009
 * (m) Anna Domanska 2011
 * orsoniasty at gmail.com
 */

#ifndef __3310LCD_H
#define __3310LCD_H

 #include "platform_config.h"
 #include "stm32f10x_conf.h"
 #include "midi_menu.h"

/* Connections:
 * PB1 - Chip Enable
 * PB2 - Reset
 * PB0 - Command/Data
 * PB13 - Clock   (SPI2 SCK)
 * PB15 - Data In (SPI2 MOSI)
 */

// Configure connections here:
#if defined USE_STM32_P103_EVAL	||	defined USE_rs3232
	
	#define LCD_CONTROL_PORT				GPIOB
	#define LCD_DATA_PORT					GPIOA
	#define MOSI							GPIO_Pin_7
	#define SCK								GPIO_Pin_5
	#define RESET_PIN						GPIO_Pin_2
	#define CE_PIN							GPIO_Pin_1
	#define DC_PIN							GPIO_Pin_0
	#define RCC_APB2Periph_GPIO_Control		RCC_APB2Periph_GPIOB
	#define RCC_APB2Periph_GPIO_Data		RCC_APB2Periph_GPIOA
	#define RCC_APBPeriph_SPI_LCD			RCC_APB2Periph_SPI1
	#define SPI_LCD							SPI1

#elif defined USE_STM32_F107VCT6
	
	#define LCD_CONTROL_PORT				GPIO?
	#define LCD_DATA_PORT					GPIOC
	#define MOSI							GPIO_Pin_12
	#define SCK								GPIO_Pin_10
	#define RESET_PIN						GPIO_Pin_?
	#define CE_PIN							GPIO_Pin_?
	#define DC_PIN							GPIO_Pin_?
	#define SPI_LCD							SPI3

	#define RCC_APB2Periph_GPIO_Control		RCC_APB2Periph_GPIO?
	#define RCC_APB2Periph_GPIO_Data		RCC_APB2Periph_GPIOB
	#define RCC_APB1Periph_SPI_LCD			RCC_APB1Periph_SPI3

#endif 

#define	ROW_SIZE							84
#define COLUMN_SIZE							6
 


// Increase if LCD does not work
#define LCD_DELAY_TIME		700

#define LCD_ResetHigh()		LCD_CONTROL_PORT->BSRR |= RESET_PIN
#define LCD_ResetLow()		LCD_CONTROL_PORT->BRR |= RESET_PIN
#define LCD_ChipDisable()	LCD_CONTROL_PORT->BSRR |= CE_PIN
#define LCD_ChipEnable()	LCD_CONTROL_PORT->BRR |= CE_PIN
#define LCD_ChipDisable()	LCD_CONTROL_PORT->BSRR |= CE_PIN
#define LCD_SetData()		LCD_CONTROL_PORT->BSRR |= DC_PIN
#define LCD_SetCommand()	LCD_CONTROL_PORT->BRR |= DC_PIN

#define LCD_DATA			1
#define LCD_COMMAND			2

void LCD_Conf(void);
void LCD_Clear(void);
void LCD_GotoXY(u8 x, u8 y);
void LCD_Char(u8 ch);
void LCD_Str(u8 *str);
void LCD_Send(u8 data, u8 mode);
void LCD_Delay(unsigned long delay);
uint8_t Str_Size(u8 *str); 
void LCD_Neg_Char(u8 ch);
void LCD_Neg_Str(u8 *str);
void LCD_Edit_Disp(u8 x, u8 y, u8 *str, u8 char_nr) ;
void LCD_Disp(u8 x, u8 y, u8 *str);
void LCD_Neg_Disp(u8 x, u8 y, u8 *str);
void LCD_Clear_Row(u8 row);
void LCD_Edit_Disp2(u8 x, u8 y, u8 *str, u8 char_nr, u8 string_size); 

static const u8 LCD_Font[][5] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00 },   /* space */
    { 0x00, 0x00, 0x2f, 0x00, 0x00 },   /* ! */
    { 0x00, 0x07, 0x00, 0x07, 0x00 },   /* " */
    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   /* # */
    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   /* $ */
    { 0xc4, 0xc8, 0x10, 0x26, 0x46 },   /* % */
    { 0x36, 0x49, 0x55, 0x22, 0x50 },   /* & */
    { 0x00, 0x05, 0x03, 0x00, 0x00 },   /* ' */
    { 0x00, 0x1c, 0x22, 0x41, 0x00 },   /* ( */
    { 0x00, 0x41, 0x22, 0x1c, 0x00 },   /* ) */
    { 0x14, 0x08, 0x3E, 0x08, 0x14 },   /* * */
    { 0x08, 0x08, 0x3E, 0x08, 0x08 },   /* + */
    { 0x00, 0x00, 0x50, 0x30, 0x00 },   /* , */
    { 0x10, 0x10, 0x10, 0x10, 0x10 },   /* - */
    { 0x00, 0x60, 0x60, 0x00, 0x00 },   /* . */
    { 0x20, 0x10, 0x08, 0x04, 0x02 },   /* / */
    { 0x3E, 0x51, 0x49, 0x45, 0x3E },   /* 0 */
    { 0x00, 0x42, 0x7F, 0x40, 0x00 },   /* 1 */
    { 0x42, 0x61, 0x51, 0x49, 0x46 },   /* 2 */
    { 0x21, 0x41, 0x45, 0x4B, 0x31 },   /* 3 */
    { 0x18, 0x14, 0x12, 0x7F, 0x10 },   /* 4 */
    { 0x27, 0x45, 0x45, 0x45, 0x39 },   /* 5 */
    { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   /* 6 */
    { 0x01, 0x71, 0x09, 0x05, 0x03 },   /* 7 */
    { 0x36, 0x49, 0x49, 0x49, 0x36 },   /* 8 */
    { 0x06, 0x49, 0x49, 0x29, 0x1E },   /* 9 */
    { 0x00, 0x36, 0x36, 0x00, 0x00 },   /* : */
    { 0x00, 0x56, 0x36, 0x00, 0x00 },   /* ; */
    { 0x08, 0x14, 0x22, 0x41, 0x00 },   /* < */
    { 0x14, 0x14, 0x14, 0x14, 0x14 },   /* = */
    { 0x00, 0x41, 0x22, 0x14, 0x08 },   /* > */
    { 0x02, 0x01, 0x51, 0x09, 0x06 },   /* ? */
    { 0x32, 0x49, 0x59, 0x51, 0x3E },   /* @ */
    { 0x7E, 0x11, 0x11, 0x11, 0x7E },   /* A */
    { 0x7F, 0x49, 0x49, 0x49, 0x36 },   /* B */
    { 0x3E, 0x41, 0x41, 0x41, 0x22 },   /* C */
    { 0x7F, 0x41, 0x41, 0x22, 0x1C },   /* D */
    { 0x7F, 0x49, 0x49, 0x49, 0x41 },   /* E */
    { 0x7F, 0x09, 0x09, 0x09, 0x01 },   /* F */
    { 0x3E, 0x41, 0x49, 0x49, 0x7A },   /* G */
    { 0x7F, 0x08, 0x08, 0x08, 0x7F },   /* H */
    { 0x00, 0x41, 0x7F, 0x41, 0x00 },   /* I */
    { 0x20, 0x40, 0x41, 0x3F, 0x01 },   /* J */
    { 0x7F, 0x08, 0x14, 0x22, 0x41 },   /* K */
    { 0x7F, 0x40, 0x40, 0x40, 0x40 },   /* L */
    { 0x7F, 0x02, 0x0C, 0x02, 0x7F },   /* M */
    { 0x7F, 0x04, 0x08, 0x10, 0x7F },   /* N */
    { 0x3E, 0x41, 0x41, 0x41, 0x3E },   /* O */
    { 0x7F, 0x09, 0x09, 0x09, 0x06 },   /* P */
    { 0x3E, 0x41, 0x51, 0x21, 0x5E },   /* Q */
    { 0x7F, 0x09, 0x19, 0x29, 0x46 },   /* R */
    { 0x46, 0x49, 0x49, 0x49, 0x31 },   /* S */
    { 0x01, 0x01, 0x7F, 0x01, 0x01 },   /* T */
    { 0x3F, 0x40, 0x40, 0x40, 0x3F },   /* U */
    { 0x1F, 0x20, 0x40, 0x20, 0x1F },   /* V */
    { 0x3F, 0x40, 0x38, 0x40, 0x3F },   /* W */
    { 0x63, 0x14, 0x08, 0x14, 0x63 },   /* X */
    { 0x07, 0x08, 0x70, 0x08, 0x07 },   /* Y */
    { 0x61, 0x51, 0x49, 0x45, 0x43 },   /* Z */
    { 0x00, 0x7F, 0x41, 0x41, 0x00 },   /* [ */
    { 0x55, 0x2A, 0x55, 0x2A, 0x55 },   /* "Yen" */
    { 0x00, 0x41, 0x41, 0x7F, 0x00 },   /* ] */
    { 0x04, 0x02, 0x01, 0x02, 0x04 },   /* ^ */
    { 0x40, 0x40, 0x40, 0x40, 0x40 },   /* _ */
    { 0x00, 0x01, 0x02, 0x04, 0x00 },   /* ' */
    { 0x20, 0x54, 0x54, 0x54, 0x78 },   /* a */
    { 0x7F, 0x48, 0x44, 0x44, 0x38 },   /* b */
    { 0x38, 0x44, 0x44, 0x44, 0x20 },   /* c */
    { 0x38, 0x44, 0x44, 0x48, 0x7F },   /* d */
    { 0x38, 0x54, 0x54, 0x54, 0x18 },   /* e */
    { 0x08, 0x7E, 0x09, 0x01, 0x02 },   /* f */
    { 0x0C, 0x52, 0x52, 0x52, 0x3E },   /* g */
    { 0x7F, 0x08, 0x04, 0x04, 0x78 },   /* h */
    { 0x00, 0x44, 0x7D, 0x40, 0x00 },   /* i */
    { 0x20, 0x40, 0x44, 0x3D, 0x00 },   /* j */
    { 0x7F, 0x10, 0x28, 0x44, 0x00 },   /* k */
    { 0x00, 0x41, 0x7F, 0x40, 0x00 },   /* l */
    { 0x7C, 0x04, 0x18, 0x04, 0x78 },   /* m */
    { 0x7C, 0x08, 0x04, 0x04, 0x78 },   /* n */
    { 0x38, 0x44, 0x44, 0x44, 0x38 },   /* o */
    { 0x7C, 0x14, 0x14, 0x14, 0x08 },   /* p */
    { 0x08, 0x14, 0x14, 0x18, 0x7C },   /* q */
    { 0x7C, 0x08, 0x04, 0x04, 0x08 },   /* r */
    { 0x48, 0x54, 0x54, 0x54, 0x20 },   /* s */
    { 0x04, 0x3F, 0x44, 0x40, 0x20 },   /* t */
    { 0x3C, 0x40, 0x40, 0x20, 0x7C },   /* u */
    { 0x1C, 0x20, 0x40, 0x20, 0x1C },   /* v */
    { 0x3C, 0x40, 0x30, 0x40, 0x3C },   /* w */
    { 0x44, 0x28, 0x10, 0x28, 0x44 },   /* x */
    { 0x0C, 0x50, 0x50, 0x50, 0x3C },   /* y */
    { 0x44, 0x64, 0x54, 0x4C, 0x44 },    /* z */
	{ 0x24, 0x66, 0xE7, 0x66, 0x24 },    /* { szczalki */
	{ 0x04, 0x06, 0x07, 0x06, 0x04 },	 /* | gora */
	{ 0x20, 0x60, 0xE0, 0x60, 0x20 },	 /* }dol */
	{ 0x10, 0x60, 0xC0, 0x70, 0x0E }	 /* ~ptak */

};

#endif /*__3310LCD_H*/
